[アップデート]CloudWatch Logsでアカウントレベルのサブスクリプションフィルターがサポートされました
こんにちは、岩城です。
先日、以下のアップデートがありましたので紹介します。
忙しい人向けまとめ
- サブスクリプションフィルターは、CloudWatch Logsのロググループから特定の文字列を検出し、以下のサービスにログ転送する機能
- Kinesis Data Stream
- Lambda
- Kinesis Data Firehoseにログ
- これまではCloudWatch Logsのロググループ単位でサブスクリプションフィルターを設定していた
- ロググループを横断して同じフィルターパターンでログ転送したい場合に、ロググループごとに設定する必要があった
- 本アップデートにより、アカウントレベルでサブスクリプションフィルターを設定でき、単一のフィルターで複数のロググループからログ転送可能となった
- アカウントレベルのサブスクリプションフィルターは、既存含めすべてのロググループが対象となる
- 特定のロググループをアカウントレベルのサブスクリプションフィルターから除外可能
- AWS CLI v2で設定する場合は、2.15.10以上にアップデートが必要
やってみた
公式ドキュメントに設定方法が記載されていますので、基本的にドキュメントのとおり設定していきます。
個人的に簡単に検証できそうだと感じたKinesis Data Firehoseにログ転送するようにアカウントレベルのサブスクリプションフィルターを設定します。
Example 3: Subscription filters with Amazon Kinesis Data Firehose
S3バケット、Kinesis Data Firehose、IAMロールについては、特筆すべき点がないので割愛します。
サブスクリプションフィルターの設定
aws logs put-account-policy
で設定しますが、ここで注意が必要です。
特定のロググループをアカウントレベルのサブスクリプションフィルターの対象から除外するselection-criteria
が、アップデートされた当日のAWS CLI v2最新バージョン(2.15.8)ではサポートされていませんでした。
今朝(2024.01.15)確認したところ、2.15.10にアップデート可能となっており、このバージョンであれば、selection-criteria
がサポートされています。
このため、まずはAWS CLI v2を最新バージョンにアップデートしてください。
以下のようなパラメーターで設定します。
aws logs put-account-policy \ --policy-name "20240112_blog_subscription_filter_policy" \ --policy-type "SUBSCRIPTION_FILTER_POLICY" \ --policy-document '{"RoleArn": "arn:aws:iam::XXXXXXXXXXXX:role/20240112_blog_cwl_to_firehose_role", "DestinationArn": "arn:aws:firehose:ap-northeast-1:XXXXXXXXXXXX:deliverystream/20240112_blog_delivery_stream", "FilterPattern": "Test", "Distribution": "Random"}' \ --selection-criteria 'LogGroupName NOT IN ["LogGroupToExclude1","LogGroupToExclude2"]' \ --scope "ALL" \
パラメーターのポイントを押さえておくと以下のような感じです。
policy-document
にて、CloudWatch LogsからKinesis Data Firehoseにログ転送するストリームと権限、CloudWatch Logsのログストリーム内で出力されるTest
をログ転送対象のイベントとして指定selection-criteria
にて、アカウントレベルのサブスクリプションフィルターの対象外となるロググループ名を指定
検証
サブスクリプションフィルターが設定されたので以下のようなロググループとログストリームを作成しました。
ロググループ | ログストリーム | 用途 |
---|---|---|
LogGroup | LogGroup_LogStream | ログ転送対象 |
LogGroup2 | LogGroup2_LogStream | ログ転送対象 |
LogGroupToExclude1 | LogGroupToExclude1_LogStream | ログ転送対象外 |
LogGroupToExclude2 | LogGroupToExclude2_LogStream | ログ転送対象外 |
ログイベントはマネジメントコンソールから簡単に作成できるので、Test
TestTest
Test1
test
のイベントを作成し、Kinesis Data Firehoseの出力先であるS3バケットにログ転送されるか確認しました。
test
を除きTest
が含まれた3イベントがログ転送されていることを確認できました。また、対象外としたLogGroupToExclude1
とLogGroupToExclude2
のロググループのイベントは転送されず、LogGroup
とLogGroup2
から転送されていることも確認できました。
以下は転送されたログイベントの例です。
{ "messageType": "DATA_MESSAGE", "owner": "XXXXXXXXXXXX", "logGroup": "LogGroup, "logStream": "LogGroup_LogStream", "subscriptionFilters": [ "20240112_blog_subscription_filter_policy" ], "logEvents": [ { <blockquote> "id": "38029474538028272237282630734261007489162212094834180096", "timestamp</blockquote> ": 1705300616615, "message": "Test" } ], "policyLevel": "ACCOUNT_LEVEL_POLICY" }
サブスクリプションフィルターでログ転送した際に付与されるキーに"policyLevel": "ACCOUNT_LEVEL_POLICY"
が追加されていることも確認できました。
おわりに
実は検証中aws logs put-account-policy
を実行した際、以下のようなエラーメッセージが出力され、サブスクリプションフィルターを設定できずに躓いていました。
An error occurred (InvalidParameterException) when calling the PutAccountPolicy operation: Could not deliver test message to specified Firehose stream. Unable to unmarshall exception response with the unmarshallers provided
このエラーメッセージからはイメージできませんが、私の場合IAMロールに設定するポリシーをap-northeast-1
にすべきところをregion
であったことによるポリシーエラーが原因でした。
公式ドキュメントをコピペする際、実行リージョンに置き換え忘れの無いようご注意ください。
本エントリが、どなたかのお役に立てれば幸いです。